home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 051-075 / 074 / units / units.c < prev   
C/C++ Source or Header  |  1995-03-13  |  18KB  |  469 lines

  1. /* unit.c - 1/17/87 */
  2.  
  3. /*
  4.         Copyright 1987 Gregory R. Simpson
  5.  
  6. UUCP: {ihnp4, seismo, decwrl, philabs, ucbvax}!decvax!cwruecmp!ncoast!simpsong
  7. CSNET: ncoast!simpsong@case.CSNET     
  8. ARPA:  ncoast!simpsong%case.CSNET@Csnet-Relay.ARPA
  9. AT&T:  (216)-473-1019
  10.  
  11.     This notice and any statement of authorship must be reproduced
  12.     on all copies.  The author does not make any warranty expressed
  13.     or implied, or assumes any liability or responsiblity for the
  14.     use of this software.
  15.  
  16.     Any distributor of copies of this software shall grant the
  17.     recipient permission for further redistribution as permitted
  18.     by this notice.     Any distributor must distribute this software
  19.     without any fee or other monetary gains, unless expressed written
  20.     permission is granted by the author.
  21.  
  22.     This software or its use shall not be: sold, rented, leased,
  23.     traded, or otherwise marketed without the expressed written
  24.     permission of the author.
  25.  
  26.     If the software is modified in a manner creating derivative
  27.     copyrights, appropriate legends may be placed on derivative
  28.     work in addition to that set forth above.
  29.  
  30.     Permission is hereby granted to copy, reproduce, redistribute or
  31.     otherwise use this software as long as the conditions above
  32.     are meet.
  33.  
  34.     All rights not granted by this notice are reserved.
  35.  
  36.  (This copyright notice was written by, Kurt Zeilenga (zeilenga@hc.dspo.gov)
  37.   thanks Kurt... -greg)
  38.  
  39. */
  40. /* This program is for Unit Conversion... */
  41.  
  42. #include <stdio.h>
  43.  
  44. #define ESC '\033'
  45. #define True 1
  46.  
  47. /* Definition for clearing Screen */
  48.  
  49. #ifdef amiga
  50. #define Clear printf("\f");
  51. #else
  52. #define Clear printf("%c[2J%c[1;1f",ESC,ESC)
  53. #endif
  54.  
  55. #define MAXGROUP 20       /* Maximum Number of Unit Groups - 1 */
  56.  
  57. struct of_units {
  58.        char  *name;       /* Name of Unit */
  59.        double value;       /* Value - Initially set to 0 */
  60.        double conversion;  /* Conversion factor to Primary Unit */
  61.        int   counter;     /* Number of units in this group */
  62.  
  63. #include "unit_table.h"
  64.  
  65. main(argc, argv)
  66. int argc;
  67. char *argv[];
  68. {
  69.        int   group, user_unit, counter, unit_counter, sameunit;
  70.        int   comp_unit, ref_unit, chart, screen;
  71.        double user_value, from_value, to_value, temp_value, value, increment;
  72.        double primary;
  73.        char c[10], *cfile, chartfile[100];
  74.        FILE *fpchart;
  75.  
  76.        /* default values */
  77.  
  78.        group      = 1;
  79.        user_unit  = 1;
  80.        user_value = 1; 
  81.  
  82.        sameunit   = 0;  /* New Unit Group */
  83.        chart      = 0;  /* Default is standard conversion */
  84.  
  85.        /* check for chart option */
  86.  
  87.        if (argc > 2)   /* usage message if extra command line arguments */
  88.        {
  89.           usage();
  90.        } else if (argc > 1) {
  91.           if ( argv[1][0] == '-' ) {
  92.              if ( argv[1][1] == 'C' || argv[1][1] == 'c' ) {
  93.                 chart = 1;
  94.              } else {
  95.                 usage();
  96.              }
  97.           } else {
  98.             usage();
  99.           }
  100.        }
  101.        while(True)        /* loop forever... */
  102.        {
  103.            if ( sameunit == 0 ) 
  104.            {
  105.               Clear;
  106.               printf("                Unit Group Selection\n");
  107.               printf("-------------------------------------------------------------\n");
  108.               printf("1.  Length                  2. Mass                \n");
  109.               printf("3.  Speed                   4. Volume              \n");
  110.               printf("5.  Area                    6. Density             \n");
  111.               printf("7.  Time                    8. Force               \n");
  112.               printf("9.  Energy/Heat/Work       10. Pressure            \n");
  113.               printf("11. Angle                  12. Power               \n");
  114.               printf("13. Electric Charge        14. Magnetic Induction  \n");
  115.               printf("15. Light                  16. Thermal Conductivity\n");
  116.               printf("17. Coeff of Heat Transfer 18. Heat Flux           \n");
  117.               printf("19. Viscosity              20. Temperature         \n");
  118.               printf("21. Constants                                      \n");
  119.               printf("---------------------------------------------------(C)grs----\n");
  120.  
  121.  
  122.               printf("Which Type of Unit? ");
  123.               getinteger(&group, MAXGROUP);
  124.               group = group - 1;   /* since array starts at 0 */
  125.               
  126.               unit_counter = unit[group][1].counter - 1;
  127.         
  128.            } /* end of sameunit if */
  129.  
  130.               switch (group)
  131.               {
  132.                  case 19:
  133.                           temperature();
  134.                           sameunit = 0;
  135.                           break;
  136.                  case 20:
  137.                           constants();
  138.                           sameunit = 0;
  139.                           break;
  140.                  default:
  141.  
  142.               Clear;
  143.               printf("                     Unit Selection\n");
  144.               printf("-------------------------------------------------------------\n");
  145.               for (counter = 0; counter <= unit_counter; counter = counter+2)
  146.               {
  147.                      printf("%2d. %-18s                       %2d. %-18s\n",
  148.                      (counter + 1), unit[group][counter].name, 
  149.                      (counter + 2), unit[group][counter + 1].name);
  150.               }
  151.               printf("-------------------------------------------------------------\n");
  152.  
  153. /* --------------------   Standard Unit Conversion   ----------------  */
  154.  
  155.               if (chart == 0) {
  156.  
  157.                      printf("Your Unit? ");
  158.                      getinteger(&user_unit, unit_counter);
  159.                      user_unit = user_unit - 1;
  160.  
  161.                      printf("\nHow many %s ? ", unit[group][user_unit].name );
  162.                      getnumber(&user_value, unit_counter);
  163.  
  164.                      Clear;
  165.                      printf("\n     ============================================================\n");
  166.  
  167.                      primary=user_value*(1/unit[group][user_unit].conversion);
  168.  
  169.                      printf("     %16.8g %s is equivalent to:\n",
  170.                      user_value, unit[group][user_unit].name);
  171.                      printf("     ------------------------------------------------------------\n\n");
  172.                      for (counter = unit_counter; counter >= 0; counter--) 
  173.                      {
  174.                             if (counter != user_unit) 
  175.                             {
  176.                                    unit[group][counter].value = 
  177.                                    primary * unit[group][counter].conversion;
  178.                                    printf("                  %16.8g %-18s\n",
  179.                                    unit[group][counter].value,
  180.                                    unit[group][counter].name);
  181.                             }
  182.                      }
  183.  
  184.                      printf("     ============================================================\n");
  185.                      printf("\n      (R)erun Unit type, (N)ew Unit type, (Q)uit, or (C)hart: ");
  186.                      scanf("%s",c);
  187.                      if ( c[0] == 'Q' || c[0] == 'q' ) {
  188.                             printf("\n    U... Units conversion, by Gregory R. Simpson - Copyright 1987 \n");
  189.                             exit();
  190.                      } 
  191.                      else if ( c[0] == 'R' || c[0] == 'r' ) {
  192.                             sameunit = 1;
  193.                      } 
  194.                      else if ( c[0] == 'N' || c[0] == 'n' ) {
  195.                             sameunit = 0;
  196.                      } 
  197.                      else if ( c[0] == 'C' || c[0] == 'c' ) {
  198.                             chart = 1;
  199.                             sameunit = 0;
  200.                      }
  201.               } 
  202.  
  203. /* ---------------------  Chart Option   --------------------- */
  204.  
  205.               else {    
  206.  
  207.                      printf("\nYour Reference Unit?  ");
  208.                      getinteger(&ref_unit, unit_counter);
  209.                      ref_unit = ref_unit - 1;
  210.                      printf("Your Comparison Unit? ");
  211.                      getinteger(&comp_unit, unit_counter);
  212.                      comp_unit = comp_unit - 1;
  213.  
  214.                      printf("\nFrom How Many %s?  ", unit[group][ref_unit].name);
  215.                      getnumber(&from_value);
  216.                      printf("To How Many %s?    ", unit[group][ref_unit].name);
  217.                      getnumber(&to_value);
  218.                      printf("By what increment? ");
  219.                      getnumber(&increment);
  220.  
  221.                      screen = 0;
  222.                      printf("\nFilename for chart? (<CR> for screen): ");
  223.                      cfile = gets(chartfile);
  224.                      if (cfile[0] == '\0') {
  225.                         fpchart = stdout;
  226.                         screen  = 1;
  227.                      } 
  228.                      else if ( ( fpchart = fopen(cfile,"a") ) == NULL ) {
  229.                         fprintf(stderr, "Can't open Chartfile.");
  230.                         exit(1);
  231.                      }                      
  232.  
  233.                      Clear;
  234.  
  235.                      /* Error Checking and Correction... */
  236.  
  237.                      if ( from_value > to_value )
  238.                      {
  239.                         fprintf(fpchart,
  240.                         "Your From value is Greater than your To value.\n");
  241.                         fprintf(fpchart,"Therefore, I swapped them.\n");
  242.                         temp_value = from_value;
  243.                         from_value = to_value;
  244.                         to_value   = temp_value;
  245.                      }
  246.                      if ( increment < 0 )
  247.                      {
  248.                        fprintf(fpchart,
  249.                        "Since your From value is Less than your To value,\n");
  250.                        fprintf(fpchart,
  251.                        "I will make your increment positive.\n");
  252.                        increment = -increment;
  253.                      }
  254.  
  255.                      fprintf(fpchart,
  256. "------------------------------------------------------------------------------\n");
  257.  
  258.                      for (value = from_value; value <= to_value; 
  259.                           value = value + increment) 
  260.                          {
  261.                            primary=value*(1/unit[group][ref_unit].conversion);
  262.                             unit[group][comp_unit].value = 
  263.                              primary * unit[group][comp_unit].conversion;
  264.                              fprintf(fpchart,
  265.                              "| %16.8g %-18s | %16.8g %-18s |\n",
  266.                              value,unit[group][ref_unit].name,
  267.                              unit[group][comp_unit].value,
  268.                              unit[group][comp_unit].name);
  269.                              fprintf(fpchart,
  270. "------------------------------------------------------------------------------\n");
  271.                      }
  272.                      if (screen == 0) {
  273.                          fclose(fpchart);
  274.                      }
  275.                      printf("\n (R)erun Unit type, (N)ew Unit type, (Q)uit, or (S)tandard Conversions: ");
  276.                      scanf("%s",c);
  277.                      if ( c[0] == 'Q' || c[0] == 'q' ) {
  278.                             printf("\n    U... Unit Conversion, by Gregory R. Simpson - Copyright 1987 \n");
  279.                             exit();
  280.                      } 
  281.                      else if ( c[0] == 'R' || c[0] == 'r' ) {
  282.                             sameunit = 1;
  283.                      } 
  284.                      else if ( c[0] == 'N' || c[0] == 'n' ) {
  285.                             sameunit = 0;
  286.                      } 
  287.                      else if ( c[0] == 'S' || c[0] == 's' ) {
  288.                             chart = 0;
  289.                             sameunit = 0;
  290.                      }
  291.  
  292.               } /* end of chart if else */
  293.           } /* end of switch */
  294.        } /* end of while */
  295. } /* ---- end of main program ---- */
  296.  
  297. /* getinteger - Get Positive Integer Routine - G.R.Simpson */
  298.  
  299. int getinteger(choice, maxval)
  300.  
  301. int *choice;
  302. int maxval;
  303. {
  304.        int status, c;
  305.        while(1) { 
  306.               status = scanf("%d", choice);
  307.               if (status == 0)
  308.               {
  309.                      scanf("%*s");
  310.                      printf("Please Use Positive Integers; try again: ");
  311.               }
  312.               else if (status == 1)
  313.               {
  314.                      while ((c = getchar()) != '\n' && c != EOF)
  315.                             ;
  316.                      if ( c == EOF )
  317.                      {
  318.                             ungetc(c, stdin);
  319.                      }
  320.                      if ( *choice > 0 && *choice <= maxval+1 ) 
  321.                      {
  322.                              return status;
  323.                      }
  324.                      printf("Please use a number from 1 to %d : ", maxval+1);
  325.               }
  326.               else  /* status is -1 */
  327.               {
  328.               printf("End of file encountered... \n");
  329.               *choice = 1;
  330.               return status;
  331.               }
  332. }
  333. }
  334.  
  335. /* getfloat - Get Floating Point Number - G.R.Simpson */
  336.  
  337. getnumber(fchoice)
  338.  
  339. double *fchoice;
  340. {
  341.        int status, c;
  342.        while( (status = scanf("%lf", fchoice)) == 0)
  343.        {
  344.               scanf("%*s");
  345.               printf("Please Use Numeric Input; try again: ");
  346.        }
  347.        if (status == 1)
  348.        {
  349.               while ((c = getchar()) != '\n' && c != EOF)
  350.                      ;
  351.               if ( c == EOF )
  352.                      ungetc(c, stdin);
  353.        }
  354.        else  /* status is -1 */
  355.        printf("End of file encountered... \n");
  356.        return status;
  357. }
  358.  
  359. /* usage - Print a usage message - G.R.Simpson */
  360.  
  361. usage()
  362. {
  363.         printf("\nusage: u [-c] \n");
  364.         printf("-c : unit chart option \n\n");
  365.         printf("U... Unit conversions; Copyright, Gregory R. Simpson 1987\n");
  366.         exit();
  367. }
  368.  
  369. /* temperature - G.R.Simpson */
  370.  
  371. temperature()
  372. {
  373. static char *scale[4] = { "Fahrenheit", "Celsius", "Rankine", "Kelvin" };
  374. double fahrenheit, celsius, rankine, kelvin;
  375. double temp;
  376. char c[2];
  377. int    choice, tempagain;
  378.  
  379.         tempagain = 1;
  380.  
  381.         while(tempagain) {
  382.               Clear;
  383.               printf("                     Unit Selection\n");
  384.               printf("-------------------------------------------------------------\n");
  385.                      printf("1. Fahrenheit                    2. Celsius \n");
  386.                      printf("3. Rankine                       4. Kelvin \n");
  387.               printf("-------------------------------------------------------------\n");
  388.  
  389.         printf("Your Temperature Scale? ");
  390.         getinteger(&choice,3);
  391.         printf("\n How many degrees %s? ", scale[choice-1]);
  392.         getnumber(&temp);
  393.         switch(choice) {
  394.               case 1 :
  395.                     fahrenheit = temp;
  396.                     break;
  397.               case 2 :
  398.                     fahrenheit = temp*(9.0/5.0) + 32.0;
  399.                     break;
  400.               case 3 :
  401.                     fahrenheit = temp - 459.67;
  402.                     break;
  403.               case 4 :
  404.                     fahrenheit = ((temp-273.15)*(9.0/5.0)) + 32.0;
  405.                     break;
  406.         }
  407.         celsius = (fahrenheit - 32) * (5.0/9.0);
  408.         rankine = fahrenheit + 459.67;
  409.         kelvin  = celsius + 273.15;
  410.  
  411.         Clear;
  412.         printf("     %16.8g degrees %s is equivalent to:\n",
  413.                      temp,scale[choice-1]);
  414.         printf("                  ------------------------------------\n");
  415.         if (choice != 1) printf("                  %16.8g degrees Fahrenheit\n", fahrenheit);
  416.         if (choice != 2) printf("                  %16.8g degrees Celsius\n",    celsius);
  417.         if (choice != 3) printf("                  %16.8g degrees Rankine\n",    rankine);
  418.         if (choice != 4) printf("                  %16.8g degrees Kelvin\n",     kelvin);
  419.  
  420.         printf("                  ------------------------------------\n");
  421.         printf("\n (R)erun Unit type, (N)ew Unit type, or (Q)uit: ");
  422.         scanf("%s",c);
  423.         if ( c[0] == 'Q' || c[0] == 'q' ) {
  424.            printf("\n    U... Unit Conversion, by Gregory R. Simpson - Copyright 1987 \n");
  425.            exit();
  426.         } 
  427.         else if ( c[0] == 'R' || c[0] == 'r' ) {
  428.            tempagain = 1;
  429.         } 
  430.         else if ( c[0] == 'N' || c[0] == 'n' ) {
  431.            tempagain = 0;
  432.         } 
  433.   } /* end while(tempagain) */
  434.         c[0] = '\0';
  435.         return;
  436. }
  437.  
  438. /* constants - G.R.Simpson */
  439.  
  440. constants()
  441. {
  442.         char c[10];
  443.  
  444.         Clear;         
  445.         printf("\npi                      =  3.141592653589793238462643\n");
  446.         printf("e                       =  2.718281828459045235360287\n");
  447.         printf("atomic mass unit        =  1.66053 e-27 kg, e-24 gm \n");
  448.         printf("Avogadro's number N     =  6.02217 e23 mole^-1 \n");
  449.         printf("Boltzmann's constant    =  R/N = 1.3806 e-23 J/K, e-16 erg/K = 8.61708 e-5 eV/K \n");
  450.         printf("gas constant            =  8.3143 J/mole-K = 0.082054 l-atm/mole-K\n");
  451.         printf("gravitational constant  =  6.673 e-11 N-m^2/kg^2, J-m/kg^2, \n");
  452.         printf("mass of electron        =  9.10956 e-31 kg, e-28 gm =  5.48593 e-4 amu \n");
  453.         printf("mass of proton          =  1.67261 e-27 kg, e-24 gm =  1.0072766 amu \n");
  454.         printf("Planck's constant       =  h =  6.62620 e-34 J-sec,  e-27 erg-sec \n");
  455.         printf("h bar                   =  h/2*pi = 1.05459 e-34 J-sec, e-27 erg-sec \n");
  456.         printf("speed of light          =  2.997925 e8 m/sec, e10 cm/sec \n");
  457.         printf("Stefan-Boltzmann constant =  5.670 e-8 W/m^2-K^4 \n");
  458.         printf("\n      <CR> to continue or (Q)uit: ");
  459.         gets(c);
  460.         if ( c[0] == 'Q' || c[0] == 'q' ) {
  461.            printf("\n    U... Unit Conversion, by Gregory R. Simpson - Copyright 1987 \n");
  462.            exit();
  463.         } else {
  464.         c[0] = '\0';
  465.         return;
  466.         }
  467. }
  468.